package engine

type Parser interface {
	Parse(contents []byte, url string) ParseResult
	Serialize() (name string, args interface{})
}

// ParserFunc 是一个公共的解析函数类型, url 也是一个公共的字段,
// 不只在 ProfileParser 中有用, 其它所有的 Parser 都有可能会用到
// 所以把 url 添加到公共的解析函数类型中
type ParserFunc func(contents []byte, url string) ParseResult

// 定义request结构体
type Request struct {
	Url    string // 请求地址
	Parser Parser
}

// 定义解析结果结构体
type ParseResult struct {
	Requests []Request // 解析出的请求
	Items    []Item    // 解析出的内容
}

// 储存关键数据结构体
type Item struct {
	Url     string
	Id      string
	Type    string
	Payload interface{} //个人资料
}

// 定义一个空的解析器结果
type NilParser struct{}

func (NilParser) Parse(_ []byte, _ string) ParseResult {
	return ParseResult{}
}

func (NilParser) Serialize() (name string, args interface{}) {
	return "NilParser", nil
}

// 函数解析器
type FuncParser struct {
	parser ParserFunc
	name   string
}

func (f *FuncParser) Parse(contents []byte, url string) ParseResult {
	return f.parser(contents, url)
}

func (f *FuncParser) Serialize() (name string, args interface{}) {
	return f.name, nil
}

func NewFuncParser(p ParserFunc, name string) *FuncParser {
	return &FuncParser{
		parser: p,
		name:   name,
	}
}
